package com.srmt.document.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * 表格列数据传输对象
 * 
 * @author YourCompany
 * @since 1.0.0
 */
public class ColumnData implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    /**
     * 列中的单元格数据
     */
    private List<String> cells;

    // 构造函数
    public ColumnData() {
        this.cells = new ArrayList<>();
    }
    
    public ColumnData(List<String> cells) {
        this.cells = cells != null ? new ArrayList<>(cells) : new ArrayList<>();
    }
    
    public ColumnData(String... cells) {
        this.cells = new ArrayList<>(Arrays.asList(cells));
    }
    
    // Builder构造函数
    private ColumnData(Builder builder) {
        this.cells = builder.cells != null ? new ArrayList<>(builder.cells) : new ArrayList<>();
    }
    
    // 便利方法
    
    /**
     * 添加单元格
     * 
     * @param value 单元格值
     */
    public void addCell(String value) {
        cells.add(value);
    }
    
    /**
     * 在指定位置插入单元格
     * 
     * @param index 插入位置
     * @param value 单元格值
     */
    public void insertCell(int index, String value) {
        if (index >= 0 && index <= cells.size()) {
            cells.add(index, value);
        }
    }
    
    /**
     * 删除指定位置的单元格
     * 
     * @param index 单元格索引
     */
    public void removeCell(int index) {
        if (index >= 0 && index < cells.size()) {
            cells.remove(index);
        }
    }
    
    /**
     * 获取指定位置的单元格
     * 
     * @param index 单元格索引
     * @return 单元格值，如果越界返回null
     */
    public String getCell(int index) {
        if (index >= 0 && index < cells.size()) {
            return cells.get(index);
        }
        return null;
    }
    
    /**
     * 设置指定位置的单元格
     * 
     * @param index 单元格索引
     * @param value 单元格值
     */
    public void setCell(int index, String value) {
        if (index >= 0 && index < cells.size()) {
            cells.set(index, value);
        }
    }
    
    /**
     * 获取单元格数量
     * 
     * @return 单元格数量
     */
    public int getCellCount() {
        return cells.size();
    }
    
    /**
     * 清空所有单元格
     */
    public void clear() {
        cells.clear();
    }
    
    /**
     * 转换为数组
     * 
     * @return 字符串数组
     */
    public String[] toArray() {
        return cells.toArray(new String[0]);
    }
    
    /**
     * 获取第一个单元格（通常是列标题）
     * 
     * @return 第一个单元格的值，如果为空返回null
     */
    public String getFirstCell() {
        return cells.isEmpty() ? null : cells.get(0);
    }
    
    /**
     * 获取最后一个单元格
     * 
     * @return 最后一个单元格的值，如果为空返回null
     */
    public String getLastCell() {
        return cells.isEmpty() ? null : cells.get(cells.size() - 1);
    }
    
    // Getters and Setters
    public List<String> getCells() {
        return cells;
    }

    public void setCells(List<String> cells) {
        this.cells = cells != null ? new ArrayList<>(cells) : new ArrayList<>();
    }

    // Builder Pattern
    public static Builder builder() {
        return new Builder();
    }
    
    public static class Builder {
        private List<String> cells;

        public Builder cells(List<String> cells) {
            this.cells = cells;
            return this;
        }

        public Builder cells(String... cells) {
            this.cells = Arrays.asList(cells);
            return this;
        }

        public Builder addCell(String cell) {
            if (this.cells == null) {
                this.cells = new ArrayList<>();
            }
            this.cells.add(cell);
            return this;
        }

        public ColumnData build() {
            return new ColumnData(this);
        }
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ColumnData that = (ColumnData) o;
        return Objects.equals(cells, that.cells);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(cells);
    }
    
    @Override
    public String toString() {
        return "ColumnData{" +
                "cells=" + cells +
                '}';
    }
}